/****************************************
 * create by:  nabian
 * Date:    2020-09-23
 * Description: http web server
 ***************************************/
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Ethernet.h>
#include <ESP8266httpUpdate.h>
#include <ESP8266WebServer.h>
#include "ioUDP.h"
#include "ioOTA.h"
#include "ioMQTT.h"
#include "ioSerial.h"
#include "ioMsgHandler.h"
#include "ioUserSettings.h"
#include "ESP8266HTTPClient.h"
#include "ioWebserver.h"
#include <ESP8266HTTPUpdateServer.h>
#include "iodevice.h"

ESP8266HTTPUpdateServer httpUpdater;//通过网页更新固件
ESP8266WebServer esp8266_server(80);
extern StaticJsonDocument<1024> udppack;
/************************************************************************
* 函数名称: handleRoot()
* 输入参数: 无
* 返回值  : 无
* 功    能: 主页回调函数
**********************************************************************/
void handleRoot()
{
    recv_msg_doc.clear();
    if (esp8266_server.arg("par").length() > 0)
    {
        DeserializationError error = deserializeJson(recv_msg_doc, esp8266_server.arg("par"));
        if (error)
        {
            Serial.println(esp8266_server.arg("par"));
            ERRORLN("Failed to parse mqtt message");
        }
        else
        {
            msgHandle(&recv_msg_doc, MsgType::HTTP);
        }
    }
    else
    {
        udppack.clear();
        udppack["cmd"] = "devinfo";
        if (WiFi.status() == WL_CONNECTED)
        {
            udppack["ip"] = WiFi.localIP().toString();
        }
        else
        {
            udppack["ip"] = "192.168.4.1";
        }

        udppack["mac"] = String(ESP.getChipId(), HEX);
        ;
        udppack["type"] = DEVTYPE;
        char sendbuf[512] = {0};
        serializeJson(udppack, sendbuf, 512);
        webserver_resp(sendbuf);
    }
}

/************************************************************************
* 函数名称: webserver_init()
* 输入参数: 无
* 返回值  : 无
* 功    能: webserver初始化
**********************************************************************/
void webserver_init(void)
{
    httpUpdater.setup(&esp8266_server);
    esp8266_server.begin();             //启动网络服务器
    esp8266_server.on("/", handleRoot); //on函数的作用就是提供页面服务，告诉MCU通过那个函数访问这个界面“/”页面，就是主页，通过handleRoot函数处理该页面
}

/************************************************************************
* 函数名称: webserver_resp()
* 输入参数: 无
* 返回值  : 无
* 功    能: 页面请求回复
**********************************************************************/
void webserver_resp(char *data)
{
    esp8266_server.sendHeader("Access-Control-Allow-Origin", "*", true);
    esp8266_server.sendHeader("Access-Control-Allow-Headers", "Origin, Content-Type, Cookie,X-CSRF-TOKEN, Accept,Authorization", true);
    esp8266_server.sendHeader("Access-Control-Expose-Headers", "Authorization,authenticated", true);
    esp8266_server.sendHeader("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, OPTIONS", true);
    esp8266_server.sendHeader("Access-Control-Allow-Credentials", "true", true);
    esp8266_server.send(200, "text/plain", data); //nodeMCU将调用
}
/************************************************************************
* 函数名称: webserverLoop()
* 输入参数: 无
* 返回值  : 无
* 功    能: 主循环调用
**********************************************************************/
void webserverLoop(void)
{
    esp8266_server.handleClient(); //处理HTTP服务器访问
}